# This Python file uses the following encoding: utf-8

#from django.contrib.auth.models import User
from missatgeria.models import Missatge
from incidencies.models import ExpulsioDelCentre,Expulsio,Incidencia
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
from usuaris.models import Professor
from django.utils.datetime_safe import datetime


#-------------------------------------------------------------------------------------
def connecta():
    
    from django.db.models.signals import post_save, pre_save, pre_delete
    
    #incidencia
    pre_delete.connect(Incidencia_pre_delete, sender= Incidencia)
    pre_save.connect(Incidencia_pre_save, sender = Incidencia )
    post_save.connect(Incidencia_post_save, sender = Incidencia )
    
    #expulsio del centre
    pre_save.connect(ExpulsioDelCentre_pre_save, sender = ExpulsioDelCentre )
    post_save.connect(ExpulsioDelCentre_post_save, sender = ExpulsioDelCentre )
    
    #expulsio
    pre_delete.connect(Expulsio_pre_delete, sender= Expulsio)
    pre_save.connect(Expulsio_pre_save, sender = Expulsio )
    post_save.connect(Expulsio_post_save, sender = Expulsio )


#-------------INCIDENCIES-------------------------------------------------------------
def Incidencia_clean( instance ):
    import datetime as dt
    
        
    #
    # Pre-save
    #
         
    #incidències d'aula: dia i franja copiat de impartició
    if instance.es_incidencia_d_aula():
        instance.dia_incidencia = instance.control_assistencia.impartir.dia_impartir
        instance.franja_incidencia = instance.control_assistencia.impartir.horari.hora

    #
    # Regles:
    #

    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4:
        return
    
    errors = {}

    #dia i hora sempre informats    
    if not instance.dia_incidencia:
        errors.setdefault('dia_incidencia',[]).append(u'Falten Dades: Cal dia')
        
    #dia i hora sempre informats    
    if  not instance.franja_incidencia_id:
        errors.setdefault('franja_incidencia',[]).append(u'Falten Dades: Cal franja')

    #Només es poden posar incidències més ennlà de 7 dies
    if instance.dia_incidencia and instance.dia_incidencia < ( dt.date.today() + dt.timedelta( days = -92 ) ):
        errors.setdefault('dia_incidencia 1',[]).append(u'''No es poden posar o modificar incidències amb més d' un trimestre)''')

    #No incidències al futur.
    if instance.dia_incidencia and instance.franja_incidencia_id  and  instance.getDate() > datetime.now():
        errors.setdefault('dia_incidencia 2',[]).append(u'''Encara no pots posar incidències en aquesta classe. Encara no s'ha realitzat.''')
        
    #No incidencies alumne que és baixa:
    if instance.alumne.data_baixa is not None and instance.alumne.data_baixa < instance.dia_incidencia:
        errors.setdefault('dia_incidencia 3',[]).append(u'''L'alumne estava de baixa en aquesta data.''')

    if len( errors ) > 0:
        raise ValidationError(errors)

def Incidencia_pre_delete( sender, instance, **kwargs):
    import datetime as dt
    
    errors = {}

    #
    # Només es poden esborrar dels darrers 7 dies
    #
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4:
        return
    
    if instance.dia_incidencia < ( dt.date.today() + dt.timedelta( days = -7) ):
        errors[NON_FIELD_ERRORS] = [u'''Aquesta incidència és massa antiga per ser esborrada (Té més d' una setmana)''']
        
    #PRECONDICIO: Només el professor que ha posat la falta o l'equip directiu la pot treure.
    if user and instance.professional.getUser().pk != user.pk:
        errors[NON_FIELD_ERRORS] = [u'''Aquesta incidència no es teva.''']
    
    if len( errors ) > 0:
        raise ValidationError(errors)
        

def Incidencia_pre_save(sender, instance, **kwargs):
 
    instance.clean()

def Incidencia_post_save(sender, instance, created, **kwargs):    
    pass

def Incidencia_despres_de_posar(instance):
    #Lògica de negoci: 
    if not instance.es_informativa:
        #Si aquest alumne ja té tres incidències cal expulsar-lo --> Envio missatge al professor.
        import datetime as t
        fa_30_dies = instance.dia_incidencia - t.timedelta( days = +30)
        nIncidenciesAlumneProfessor = Incidencia.objects.filter( 
                                            es_vigent = True, 
                                            es_informativa = False,
                                            professional = instance.professional, 
                                            alumne = instance.alumne,
                                            dia_incidencia__gt =  fa_30_dies
                                        ).count()
        if nIncidenciesAlumneProfessor > 2:                
            txt = u"""A l'alumne {0} ja li has posat {1} incidències en els darrers 30 dies. 
                    Segons la normativa del Centre has de tramitar 
                    una expulsió per acumulació d'incidències.""".format( instance.alumne, nIncidenciesAlumneProfessor ) 
            msg = Missatge( remitent = instance.professional.getUser(), text_missatge = txt )
            msg.enllac = '/incidencies/posaExpulsioPerAcumulacio/' + str( instance.pk )
            if nIncidenciesAlumneProfessor > 5:
                msg.importancia = 'VI'
            msg.envia_a_usuari(instance.professional)
            
        #Cal que els professors i tutors sàpiguen que aquest alumne ha tingut incidència --> Envio missatge 
        remitent = instance.professional
        text_missatge = u"""Ha posat una incidència {0}a {1} ({2}) el dia {3}. 
                            El text de la incidència és: {4}""".format(
                                    'informativa ' if instance.es_informativa else '',
                                    instance.alumne,
                                    instance.alumne.grup,
                                    instance.dia_incidencia,
                                    instance.descripcio_incidencia)
        msg1 = Missatge( remitent = remitent.getUser(), text_missatge = text_missatge )           
        #si és una unitat formativa envio a tots:
        es_unitat_formativa = False
        try:
            from assignatures.models import TipusDAssignatura
            uf = TipusDAssignatura.objects.get( tipus_assignatura__startswith = 'Unitat Formativa' )
            es_unitat_formativa =                                           \
                                    instance.control_assistencia and  \
                                    instance.control_assistencia.impartir.horari.assignatura.tipus_assignatura == uf
        except:
            pass
        if es_unitat_formativa: 
            professors_que_tenen_aquest_alumne_a_classe = Professor.objects.filter( horari__impartir__controlassistencia__alumne = instance.alumne ).exclude( pk = instance.professional.pk ).distinct()
            for professor in professors_que_tenen_aquest_alumne_a_classe:
                esTutor = True if professor in instance.alumne.tutorsDeLAlumne() else False
                importancia = 'VI' if esTutor else 'PI'
                msg1.envia_a_usuari( professor.getUser(), importancia )
        else:
            professors_tutors_de_l_alumne = [ p for p in instance.alumne.tutorsDeLAlumne() ]
            for professor in professors_tutors_de_l_alumne:
                importancia = 'PI'
                msg1.envia_a_usuari( professor.getUser(), importancia )
        

#-------------EXPULSIONS DEL CENTRE-------------------------------------------------------------      
def ExpulsioDelCentre_pre_delete(sender, instance, **kwargs):
    #
    # Regles:
    #
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4:
        return
        
    errors={}

    instance.instanceDB = None   #Estat a la base de dades
    if instance.pk:    
        instance.instanceDB = instance.__class__.objects.get( pk = instance.pk )

    if instance.instanceDB is not None and instance.instanceDB.impres:
        errors.setdefault('impres',[]).append(u'Aquesta expulsió ja ha estat impresa. No es pot modificar.')

    if len( errors ) > 0:
        raise ValidationError(errors)

def ExpulsioDelCentre_clean(instance):
    #
    # Regles:
    #
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4:
        return
        
    errors={}

    instance.instanceDB = None   #Estat a la base de dades
    if instance.pk:    
        instance.instanceDB = instance.__class__.objects.get( pk = instance.pk )

    if instance.instanceDB is not None and instance.instanceDB.impres:
        errors.setdefault('impres',[]).append(u'Aquesta expulsió ja ha estat impresa. No es pot modificar.')

    if len( errors ) > 0:
        raise ValidationError(errors)

def ExpulsioDelCentre_pre_save(sender, instance, **kwargs):
    instance.tmp__calNotificar = False
    if  instance.pk is not None:
        db_instance = instance.__class__.objects.get( pk = instance.pk )
        instance.tmp__calNotificar =  not db_instance.impres and instance.impres

def ExpulsioDelCentre_post_save(sender, instance, created, **kwargs):
    # missatge pels professors que tenen aquest alumne a l'aula (exepte el professor que expulsa):
    if instance.tmp__calNotificar:
        txt_msg = u"L'alumne {0} ha estat expulsat del centre ( del {1} al {2} ).".format( instance.alumne, instance.data_inici.strftime( '%d/%m/%Y' ), instance.data_fi.strftime( '%d/%m/%Y' ) )
        msg = Missatge( remitent = instance.professor.getUser(), text_missatge =txt_msg )           
        professors_que_tenen_aquest_alumne_a_classe = Professor.objects.filter( horari__impartir__controlassistencia__alumne = instance.alumne ).distinct()                    
        for professor in professors_que_tenen_aquest_alumne_a_classe:
            esTutor = True if professor in instance.alumne.tutorsDeLAlumne() else False
            importancia = 'VI' if esTutor else 'PI'
            msg.envia_a_usuari( professor.getUser(), importancia )

#-------------EXPULSIONS-------------------------------------------------------------

def Expulsio_clean( instance ):
    
    #
    # Pre-save
    #
    
    if instance.provoca_expulsio_centre:
        instance.es_vigent = False

    #dia i franja són per incidències fora d'aula.
    if instance.es_expulsio_d_aula():
        instance.dia_expulsio = instance.control_assistencia.impartir.dia_impartir
        instance.franja_expulsio = instance.control_assistencia.impartir.horari.hora
        
    if instance.tramitacio_finalitzada:
        instance.estat = 'TR' 
        
    #
    # Regles:
    #
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    
    if l4:
        return
        
    errors={}

    instance.instanceDB = None   #Estat a la base de dades
    if instance.pk:    
        instance.instanceDB = instance.__class__.objects.get( pk = instance.pk )

    if instance.instanceDB is not None and instance.instanceDB.tramitacio_finalitzada:
        errors.setdefault('tramitacio_finalitzada',[]).append(u'Aquesta expulsió ja ha estat tramitada. No es pot modificar.')
    
    if instance.estat == 'AS' and instance.professor is None:
        errors.setdefault('professor',[]).append(u'Falten Dades: professor que expulsa.')

    #comprovar que hi ha dia i franja
    if instance.dia_expulsio is None or instance.franja_expulsio_id is None:
        errors.setdefault('dia_expulsio',[]).append(u'Falten Dades: Cal dia i franja.')
        errors.setdefault('franja_expulsio',[]).append(u'Falten Dades: Cal dia i franja.')
    
    #si tramitacio_finalitzada cal que hi hagi professor informat
    if instance.tramitacio_finalitzada and instance.professor_id is None:
        errors.setdefault('professor',[]).append(u'Falten Dades: professor que expulsa.')
    
    #si tramitacio_finalitzada cal que hi hagi tutor contactat
    if instance.tramitacio_finalitzada and not instance.tutor_contactat_per_l_expulsio:
        errors.setdefault('tutor_contactat_per_l_expulsio',[]).append( u'Falten Dades: tutor contactat.' )
    
    #si tramitacio_finalitzada cal que hi hagi moment contactat
    if instance.tramitacio_finalitzada and not instance.moment_comunicacio_a_tutors:
        errors.setdefault('moment_comunicacio_a_tutors',[]).append(u'Falten Dades: moment de contacte.')

    #si tramitacio_finalitzada la data ha de ser inferior a ara
    if instance.tramitacio_finalitzada and instance.moment_comunicacio_a_tutors \
             and instance.moment_comunicacio_a_tutors > datetime.now():
        errors.setdefault('moment_comunicacio_a_tutors',[]).append(u'Comprova la data de contacte.')

    #Comprovació que és propietari de l'expulsió: ull, en el procés d'assignació pot estar sense propietari.
    estat_superior_a_ES = instance.estat != 'ES' and  \
                            ( instance.instanceDB.estat != 'ES' if instance.instanceDB else True )
    correspon_usuari =  instance.professor.pk == user.pk if user and instance.professor else True 
    if  estat_superior_a_ES and not correspon_usuari:
        errors[NON_FIELD_ERRORS] = [u'''Aquesta expulsió està gestionada per un altre professor. Necessites accés de Nivell 4 (UAT) per modificar-la.''']
    
    if len( errors ) > 0:
        raise ValidationError( errors )

    #Anoto canvis d'estat
    if instance.instanceDB is not None:
        instance.canviEstat = (instance.instanceDB.estat,  instance.estat)
        
    

def Expulsio_pre_save(sender, instance, **kwargs):

    instance.clean()

def Expulsio_post_save(sender, instance, created, **kwargs):
    pass


def Expulsio_pre_delete( sender, instance, **kwargs):
    ( user, l4)  = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
    if l4:
        for incidencia in instance.incidencia_set.all():
            incidencia.credentials = instance.credentials if hasattr( instance, 'credentials') else (None,None,)
            incidencia.es_vigent = True
            incidencia.provoca_expulsio = None
            incidencia.save()
    else:            
        errors={}
        if  user:
            errors[NON_FIELD_ERRORS] = [u'''No es poden esborrar expulsions.''']    

        if len( errors ) > 0:
            raise ValidationError( errors )    
        

    
def Expulsio_despres_de_posar(instance):
    professor_recull = instance.professor_recull
    professor_expulsa = instance.professor

    # missatge pel professor que recull la incidència:    
    if professor_recull != professor_expulsa:
        msg = Missatge( remitent = professor_recull.getUser(),
                        text_missatge = u'''ha recollit la següent expulsió: {0}'''.format( unicode( instance ) ) )
        msg.envia_a_usuari(instance.professor_recull.getUser(), 'PI')

    # missatge pel professor que expulsa:
    msg = Missatge( remitent = professor_recull.getUser(),
                    text_missatge =  u'''Cal tramitar expulsió: {0}'''.format( unicode( instance ) ),
                    enllac = '/incidencies/editaExpulsio/{0}/'.format( instance.pk ) )
    msg.envia_a_usuari(instance.professor.getUser(), 'VI')

    # missatge pels professors que tenen aquest alumne a l'aula (exepte el professor que expulsa):
    msg = Missatge( remitent = professor_recull.getUser(), text_missatge = unicode( instance ) )           
    professors_que_tenen_aquest_alumne_a_classe = Professor.objects.filter( horari__impartir__controlassistencia__alumne = instance.alumne ).exclude( pk = instance.professor.pk ).distinct()                    
    for professor in professors_que_tenen_aquest_alumne_a_classe:
        esTutor = True if professor in instance.alumne.tutorsDeLAlumne() else False
        importancia = 'VI' if esTutor else 'PI'
        msg.envia_a_usuari( professor.getUser(), importancia )





            
